// for old browsers
window.undefined = window.undefined;

window.hana = window.hana || {};
var __app__ = hana;

__app__.prefix = 'hana';
__app__.extend = function(attrs) {
	$.extend(this, attrs);
	return this;
};

__app__ .extend((function(app, $, undefined){

    var has = Object.prototype.hasOwnProperty, 
		toStr = Object.prototype.toString,
		console = $.browser.ie ? {log:function(){}} : console,
		isTouch = 'ontouchstart' in document.documentElement,
		stripTagsRE    = /<\/?[^>]+>/gi,
        stripScriptsRe = /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
        nl2brRe        = /\r?\n/g;
    
	return {
		// 터치 디바이스 여부
		isTouch : isTouch,
		// 마우스디바이스 여부
		isMouse : !isTouch,
		// 네임스페이스 생성
		namespace : function(ns){
			var parts = ns.split("."), parent = app.prefix ? window[app.prefix] : window, i;
			for (var i = -1, item; item = parts[++i];) {
				parent = (parent[item] = parent[item] || {});
			}
			return parent;
		},
		// body 엘리먼트 반환
		getBody: (function() {
			var body;
			return function() {
				return body || (body = document.body);
			};
		}()),
		// 헤드엘리먼트 반환
		getHead: (function() {
			var head;
			return function() {
				return head || (head = document.getElementsByTagName("head")[0]);
			};
		}()),
		// 도큐먼트 엘리먼트 반환
		getDoc: (function() {
			var doc;
			return function() {
				return doc || (doc = document);
			};
		}()),

		// 새로운 객체에 속성 복제
        mix: function(){
            var arg, prop, c = {};
            for (arg = -1, item; item = arguments[++arg];) {
                for (prop in item) {
                    if (has.call(item, prop)) {
                        c[prop] = item[prop];
                    }
                }
            }
            return c;
        },
		/**
		 * 지정한 자릿수만큼 0으로 채우는 함수
		 * 
		 * @param {Integer} num 수
		 * @param {Integer} numZeors 자릿수
		 * @returns {String} 결과값
		 */
		zeroPad: function(num, numZeros){
			numZeros = numZeros || 2;
			var n = Math.abs(num), 
				zeros = Math.max(0, numZeros - Math.floor(n).toString().length ), 
				zeroString = Math.pow(10,zeros).toString().substr(1);
			if( num < 0 ) {
					zeroString = '-' + zeroString;
			}
			return zeroString + n;
		}
    };
    
})(__app__, jQuery));


(function(app, $, undefined){

	/**
	 * 지정한 수 만큼 콜백함수를 실행
	 *
	 * @param {Integer} n 반복할 회수
	 * @param {Function} cb 콜백함수
	 * @return {Boolean} 종료여부
	 */
	app.repeat = function(n, cb) {
		for(var i = 0; i < n; i++) {
			if(cb.call(null, i, i + 1, n) === false) return false;
		}
		return true;
	};

	/**
	 * 0 ~ max사이의 dim(+1/-1) 값을 반환
	 *
	 * @param {Integer} max 최대값
	 * @param {Integer} now 현재값
	 * @param {Integer} dim 증감값
	 * @return {Integer} 결과값
	 */
	app.nextNumber = function(max, now, dim) {
		now += dim;
		if (now >= max) {
			return 0;
		} else if (now < 0) {
			return max - 1;
		}
		return now;
	};

	/**
	 * 두번 바인딩이 되지 않도록 체크하기 위한 함수
	 *
	 * @param {Node} obj 이미 바인딩했는지 체크할 노드
	 * @param {String} name 바인딩 명
	 * @returns {Boolean} 기존 바인딩여부
	 */
	app.checkBuild = function(obj, name) {
		if ($(obj).data('apply-' + name)) return true;
		$(obj).data('apply-' + name, true);
		return false;
	};

	/**
	 * 스와이프가 바인딩된 부분에서 링크를 클릭했을 깨 실행할 콜백함수
	 *
	 * @param {jQuery Events} e 이벤트
	 * @param {Node} target 타깃
	 * @param {Integer} 터치 간격
	 */
	app.onSwipeClick = function(e, target, distance){
		var a = $(this), target = a.attr('target');

		if (target == '_blank') {
			window.open(a.attr('href'));
		} else {
			location.href = a.attr('href');
		}
	};

	/**
	 * 스와이프 이벤트 바인딩
	 *
	 * @param {Node} obj 노드
	 * @param {Object} attr 속성
	 */
	app.onSwipeEnd = function(obj, attr){
		attr = attr || {};
		var swipeOptions = {
			allowPageScroll: 'vertical',	// 상하스와이핑은 시스템에 떠넘김
			threshold: typeof attr.threshold !== 'undefined' ? attr.threshold : 50,					// 스와이프를 발생시킬 최소한의 움직임 크기
			swipeStatus: function (event, phase, direction, distance) {
				if (phase == 'end') {
					event.preventDefault(), event.stopPropagation();
					// End 콜백하수
					attr.onEnd && attr.onEnd.call(obj. event, phase, direction, distance);
					switch(direction){
					case "left":
						// left end 콜백함수
						attr.onLeft && attr.onLeft.call(obj. event, phase, direction, distance);
						break;
					case "right": 
						// right end 콜백함수
						attr.onRight && attr.onRight.call(obj. event, phase, direction, distance);
						break;
					}
				}
			}
		};
		
		// 클릭 콜백함수
		if (attr.onClick){ swipeOptions.click = attr.onClick; }

		obj.off('.hanaswipe').on('selectstart.hanaswipe', function (e) { e.preventDefault(); }).swipe(swipeOptions);	
		return obj;
	};

	/**
	 * 기존 노드에 on를 빼고 새로운 노드에 on를 추가
	 *
	 * @param items on를 제거할 노드
	 * @param idx on를 추구할 노드
	 */
	app.addActiveClass = function(items, idx) {
		if ($.isNumeric(idx)) {
			items.removeClass('on').eq(idx).addClass('on');
		} else {
			items.removeClass('on');
			$(idx).addClass('on');
		}
	};

	app.postSubmit = function(url, params){
		var f = $('<form method="post"></form>').appendTo(document.body);
		f.attr({
			action: url
		});
		if (params) {
			for(var k in params){
				$('<input>').attr({'type':'hidden', 'name': k, 'value': params[k]}).appendTo(f);
			}
		}
		f.get(0).submit();
	};

 })(__app__, jQuery);

 (function(app, $, undefined) {

	/**
	 * 엘리먼트에 호버 효과 적용
	 * 
	 * @returns {jQuery} 
	 */
	$.fn.hoverClass = function(option){
		var o = $.extend({
				className: 'on',
				onOver: function(){},
				onOut: function(){}
			}, option);
		return this.each(function(){
			var T = $(this).off('.hana');

			T.on({
				'mouseenter.hana': function(e){
					T.addClass('on');
					o.onOver.apply(this, arguments);
				}, 
				'mouseleave.hana': function(e){
					T.removeClass('on');
					o.onOut.apply(this, arguments);
				}
			});
		});
	};


	/**
	 * 마우스관련 이벤트 무효과
	 */
	$.fn.preventMouseEvent = function(option) {
		var o = $.extend({

		}, option);

		if (app.isTouch) {
			return this;
		}

		return this.each(function(){

			this.onclick = this.onselectstart = this.ondragstart = this.onmousedown = function(event){
				event = event || window.event;

				if ($.browser.msie && $.browser.version < 8) {
					event.returnValue=false; 
				}
				if ('preventDefault' in event) {
					event.preventDefault();
				}
				return false;
			};

			return;
		});
	};

	/**
	 * 갤러리 슬라이더
	 **/
 	$.fn.hanaGallerySlider = function(option) {
		var o = option = $.extend({
			/*
			initIndex: 0,			// 초기에 표시할 이미지의 인덱스
			duration: 'fast',	// 슬라이딩 속도
			onNextClick: function(idx, newIdx) {
				// 다음버튼을 클릭했을 때 실행할 코드
			},
			onPrevClick: function(idx, newIdx) {
				// 이전버튼을 클릭했을 때 실행할 코드
			}
			*/
		}, option);

		return this.each(function(i){
			if (app.checkBuild(this, 'galleryslider')) return;

			var T = $(this),
				width = T.outerWidth(),											// 컨텐이너 width
				height = T.outerHeight(),										// 컨테이너 height
				C = $('ul.viewer_list', T),										// 박스 노드
				H = C.children().css({'width': width}),						// 썸네일 노드들
				total = H.size(),													// 썸네일 갯수
				A = $('>.viewer_num', T),										// 캡션노드
				P = $('>.btn_pre>a', T).data('dim', -1),						// 이전버튼 노드
				N = $('>.btn_next>a', T).data('dim', 1),					// 다음버튼 노드
				B = P.add(N).removeClass('on'),								// 이전다음 버튼들
				duration = ('duration' in o) ? o.duration : 'fast',			// 슬라이딩 속도
				current = 0,														// 현재 인덱스
				direction = false,													// 슬라이딩 방향
				caption = function(){											// 캡션 표시
					// 현재 인덱스 표시
					A.html(['<strong>', current + 1, '</strong>', '/', '<span>', total, '</span>'].join(''));
				}, 
				// 이미지 슬라이딩 구현
				rep = function(dim, beAnimate){

					// 현재 애니메이션 중이면 실행 무시
					//if (C.data('animated')) return;

					var left = 0, old_current = current;
					current = app.nextNumber(total, current, dim);		

					if (dim > 0) { // 왼쪽으로 이동시 : 첫번째에 있는 썸네일을 맨끝으로 이동
						if (direction) {
							C.append(C.find('li:first'));
							
							if (app.isTouch){
								C.transition({'left': 0});
							} else {
								C.css('left', 0);
							}
						}
						left = -width, direction = true;
					} else if (dim < 0) { // 오른쪽으로 이동시 : 끝에 있는 걸 맨앞으로 이동
						if (!direction) {
							C.prepend(C.find('li:last'));
							
							if (app.isTouch){
								C.css({'left': 0}).transition({'left': -width});
							} else {
								C.css('left', -width);
							}
						}
						left = 0, direction = false;
					}

					// 애니메이션 효과 사용 여부
					if (beAnimate === false) {
						if (app.isTouch){
							C.css('left', 0);
						}
						C[app.isTouch ? 'transition' : 'css']({'left': left});
						caption();
					} else {
						C.stop()[app.isTouch ? 'transition' : 'animate']({'left': left}, 'fast', function(){
							caption();								
						});
					}
				};

			// 박스의 크기를 지정
			C.css({'width': width * total});
			caption();

			// 이미지가 하나 이하일 때는 슬라이더 기능 미구현
			if (total <= 1) {
				return B.add(N).hide(), false;
			}			

			// 이전,다음 클릭 바인딩
			if(app.isMouse) B.hoverClass('on');
			B.on('click', function(e){
				e.preventDefault();

				var self = $(this), dim = self.data('dim'); // prev:-1, next:1
				rep(dim);	
				// 등록된 이벤트핸들러 실행
				if (dim == 1) {
					o.onNextClick&&o.onNextClick.call(this, current, app.nextNumber(total, current, 1));
				} else {
					o.onPrevClick&&o.onPrevClick.call(this, current, app.nextNumber(total, current, -1));
				}			
			});

			// 스와이프 바인딩
			app.onSwipeEnd($(this), {
				onLeft: function(){
					N.trigger('click');	
				},
				onRight: function(){
					P.trigger('click');
				}
			});

			// 옵션에 initIndex가 있을 경우 이 인덱스에 해당하는 이미지를 처음에 표시
			if (typeof o.initIndex !== 'undefined' && o.initIndex > 0) {
				rep(o.initIndex, false);
			}
		});
	};

	/**
	 * 탭컨트롤 모듈
	 **/
	$.fn.hanaTabs = function(option) {
		var o = option = $.extend({
				/*
				selectedIndex: 0,							// 기본 탭인덱스
				onTabsInit: function(idx){},				// 탭 초기화때 실행할 콜백함수
				onTabClick: function(event, idx){}	// 각 탭을 클릭했을 때 실행할 콜백 함수
				*/
			}, option);

		// className에서 ([a-z]+_[0-9]{2})에 해당하는 class 를 추출, ex) japan_01 형식이 있으면 이 값을 추출하여 japan, 01 를 분리하여 반환
		function getTabNumber(className){
			var m =  className.match(/([a-z]+)_([0-9]+)/i);
			return {
				className: m && m.length>2 ? m[0] : '',		// prefix_일련번호
				name: m && m.length>2 ? m[1] : '',				// prefix
				num: m && m.length>2 ? parseInt(m[2]) : 1	// 일련번호
			};
		}

		return this.each(function(i){
			if (app.checkBuild(this, 'tabs')) return;

			var $this = $(this), 
				$lis = $this.find('>ul>li.tab_m'),							// 탭버튼들
				$btns = $this.find('>ul>li.tab_m>a'),					// 탭버튼에 있는 링크
				$contents = $this.find('>ul>li>.ui_tab_content'),	// 탭에 해당하는 컨텐츠 영역
				initTN = getTabNumber($this[0].className),		// tabWrap 에서 일련번호에 해당하는 class추출
				tabNo = typeof o.selectedIndex === 'undefined' ? parseInt($this.attr('data-tab') || initTN.num) - 1 : o.selectedIndex;

			// 탭번튼들
			$lis.each(function(idx){
				var self = $(this), 
					btn = self.find('>a'),								// 탭버튼
					content = self.find('.ui_tab_content');		// 탭내용

				// 탭초기화 콜백함수 실행
				if (option.onTabsInit) {
					option.onTabsInit.call(self, idx);
				}
				btn.on('click', function(e){				
					e.preventDefault();

					// 탭별로 국가명_인덱스 에 해당하는 className으로 변경
					var tn = getTabNumber($this[0].className);
					tn && $this
						.removeClass(tn.className)
						.addClass(tn.name+'_'+app.zeroPad(idx+1)); // ex) 탭이 0번째일 때 japan_01, 1번째일때 japan_02 ..식으로 전환
					
					app.addActiveClass($btns, btn);
					$contents.hide(), content.eq(0).show(); // 탭에 해당하는 컨텐츠를 표시

					// 탭클릭시 콜백함수 실행
					if(option.onTabClick){
						option.onTabClick.call($this[0], e, idx);
					}
				});
			});

			// 처음에 표시할 기본탭
			$lis.eq(tabNo).find('>a').trigger('click');
		});
	};

	$.fn.hanaGlobalTabs = $.fn.hanaTabs;

 })(__app__, jQuery);

 (function(app, $, undefined){

	// 페이지내에서 레이어가 단일로 표시되도록 관리 하기위한 팝업매니저
	this.popupManager = app.popupManager = (function(){
		var activeDropbox = null,	// 현재 열려진 드롭메뉴
			activeMenu = null,		// 열려진 드롭메뉴의 소유자 메뉴
			doc = $(document);

		// 레이어영역 밖에서 터치/마우스다운일 때 열려있는 레이어를 닫는다
		doc.on('touchstart mousedown', function(e){
			var target = $(e.target);
			if (activeDropbox && target.closest(activeDropbox).size() == 0 && target.closest(activeMenu).size() == 0) {
				popupManager.hide();
			}
		});

		$(window).on('unload', function(){ 
			activeDropbox = activeMenu = null;
			doc.off('touchstart mousedown');
		});	

		return {
			/**
			 * 열려진 드롭메뉴를 닫는다.
			 */
			hide: function(){
				activeDropbox && activeDropbox.hide();
				activeMenu && activeMenu.removeClass('on');
			},
			/**
			 * 드롭메뉴를 표시한다.
			 * 
			 * @param {Node} menu 클릭한 메뉴
			 * @param {Node} box 드롭메뉴
			 */
			show: function(menu, box) {
				this.hide();
				menu && menu.addClass('on'), box && box.show();
				activeDropbox = box, activeMenu = menu;
			}
		};
	})();

	// GNB
	$.fn.hanaGNB = function(option){
		var o = $.extend({

		}, option);

		return this.each(function(){
			if (app.checkBuild(this, 'gnb')) return;

			var gnb = $(this),
				btn_sort = gnb.find('ul.btn_sort>li'),
				sub_layers = gnb.find('div.depth2_list, div.deapth2_img'),
				dropmenu_links = gnb.find('a.ui_dropmenu'),

				// 하나를 토글링하면 다른 메뉴도 일괄 토글링 시킴
				toggle_all_type = function(type) {
					btn_sort.removeClass('on'), sub_layers.css({'visibility': 'hidden', 'display':'none'});  // ie7, 8 에서 이상한 버그가 있어서 visibility, display를 동시에 전환
					btn_sort.filter('.'+type+'_type').addClass('on');

					if (type === 'img') {
						sub_layers
							.filter('.deapth2_img')
								.css({'visibility': 'visible', 'display': 'block'})
							.parent()
								.addClass('navi_img')/*
								.end()						
							.find('>ul.img_type').trigger('refreshview')*/;
					} 
					else if (type === 'list') {
						sub_layers.filter('.depth2_list').css({'visibility': 'visible', 'display':'block'}).parent().removeClass('navi_img');						
					}
				};

			// 이미지형, 리스트형 토글
			btn_sort.find('>a').on('click', function(e) {
				e.preventDefault();

				var self = $(this), 
					li = self.parent();

				if (li.hasClass('on')) { return; }
				toggle_all_type(li.hasClass('list_type') ?'list':'img');
			});


			// pc에서는 페이지 이동, 터치에서는 레이어표시
			if (app.isTouch) {
				gnb.on('click', 'a.ui_dropmenu', function(e) {
					e.preventDefault();

					var self = $(this), 
						parent = self.parent(), 
						next = self.next(), 
						isActive = next.is(':visible');

					isActive && popupManager.hide();
					!isActive && popupManager.show(parent, next);							
				});
			} else if (app.isMouse) {
				gnb.find('ul.util_menu a.ui_dropmenu').on('click', function(e) { e.preventDefault(); });
				
				// 리스트형 메뉴에 포커스가 오면 부모를 호버시킴
				gnb.find('.depth4')
					.hover(function(){ 
						$(this).parent().addClass('on'); 
					}, function(){ 
						$(this).parent().removeClass('on'); 
					});

				// 맨끝의 메뉴에서 탭키를 눌렀을 때는 포커스가 바깥으로 벗어나는 것이므로 드롭메뉴를 닫아준다.
				gnb
					.find('div.depth2_list a:last, div.deapth2_img a:last').on('blur', function(e) {
						popupManager.hide();
					});

				// 사이트맵 링크를 드롭메뉴가 없으므로 열린 드롭메뉴를 닫아준다.
				gnb
					.find('ul.util_menu a:first').on('focus', function(){
						popupManager.hide();
					});

				// 마우스 오버시 드롭다운를 표시하고 마우스아웃에서 닫아준다.
				gnb
					.on('mouseenter mouseleave', 'li:has(>a.ui_dropmenu)', function(e) {
						var self = $(this), etype = e.type;
						switch (etype) {
						case 'mouseenter': 
							popupManager.show(self, self.find('>.ui_dropmenu').next());
							break;
						case 'mouseleave':
							popupManager.hide();
							break;	
						}
						e.preventDefault();
						e.stopPropagation();
					});

				// 장차법 규정에 따라 메뉴에 포커스인 되었을 때 해당 드롭메뉴가 표시되도록 바인딩
				dropmenu_links.focus(function(e) {
					var self = $(this), 
						parent = self.parent(), 
						next = self.next();
						popupManager.show(parent, next);
				});

			}	// app.isMouse

			// 이미지형 메뉴 //////////////////////////////////////////////////////////////
			var img_layers = gnb.find('div.deapth2_img'),
				regex = /\{\{page\}\}/ig,
				ITEM_COUNT = 5,				// 페이지당 표시할 썸네일 수
				ITEM_WIDTH = 182,				// 썸네일 너비
				VIEW_WIDTH = ITEM_COUNT * ITEM_WIDTH;	// 박스의 총 너비

			// 이미지 레이어들
			img_layers.each(function(iii) {
				var self = $(this),
					page_button,															// 페이징 버튼
					items = self.find('ul.depth3>li'),									// 썸네일들
					count = items.size(),													// 썸네일 갯수
					pages = Math.ceil(count / ITEM_COUNT),						// 페이지 수
					navi_page = self.find('>div.navi_page'),						// 페이징버튼들의 박스
					pageBtns = navi_page.find('a'),									// 페이징 버튼들
					img_panel = self.find('>ul.img_type'),							// 이미지 패널
					/**
					 * 페이지 이동
					 *
                     * @param {Integer} page_idx 페이지 인덱스
					 */
					movePage = function(page_idx) {
						img_panel.data('pageindex', page_idx);
						// 보이는 영역의 밖에 있는 썸네일들은 포커스가 안가도록 숨김처리 해준다.
						items.each(function(ii){
							var btn = items.eq(ii);
							if (btn.data('page') != page_idx) {
								btn.find('>a').hide();
							}
						});
						// 현재 페이지에 해당하는 페이징버튼을 활성화
						app.addActiveClass(pageBtns, page_idx);
					},

					/**
					 * 박스 이동
					 *
					 * @param {Integer} page_index 페이지 인덱스
					 * @param {Boolean} beAnimate 애니메이션 효과 사용여부
					 */
					movingAnimate = function(page_idx, beAnimate) {
						var left = -(ITEM_WIDTH * ITEM_COUNT * page_idx);

						if (beAnimate === false) {
							items.find('>a').show();
							img_panel.stop().css({left: left});
							movePage(page_idx);
						} 
						else {
							items.find('>a').show();
							img_panel.stop()[app.isTouch ? 'transition' : 'animate']({left: left}, 'fast', function() { 
								movePage(page_idx);
							});
						}
					},

					/**
					 * 끝부분에서 튕기는 효과
					 *
					 * @param {Boolean} left 외쪽이면 true, 오른쪽이면 false
					 */
					swipeBouncing = function(left) {
						var full_width = (pages - 1) * VIEW_WIDTH;

						if (app.isTouch){
							img_panel.transition({left: left ? ITEM_WIDTH : -(full_width + ITEM_WIDTH)}, 
								'fast',
								function(){
									img_panel.transition({left: left ? 0 : -full_width}, 'fast');
								}
							);
						} else {
							if (img_panel.data('animated')) { return; }
							img_panel.data('animated', true)[app.isTouch ? 'transition' : 'animate'](
								{left: left ? ITEM_WIDTH : -(full_width + ITEM_WIDTH)}, 
								'fast', 
								function(){
									img_panel[app.isTouch ? 'transition' : 'animate']({left: left ? 0 : -full_width},  'fast', function(){ img_panel.removeData('animated'); });
								}
							);
						}
					};

				// 썸네일들
				items.each(function(idx) {
					// img type에서 현재 아이템에 해당하는 페이지를 선택할 수 있도록 인덱스를 저장
					var m = $(this).data({index: idx, page: Math.floor(idx / ITEM_COUNT)}),
						n = (idx + 1) % ITEM_COUNT,
						isEnd = n == 0;
					
					if (app.isMouse) {
						// 목록의 끝에서 탭키를 눌렸을 때 다음 페이지의 첫번째 항목에 포커싱
						if (isEnd && items.length - 1 !== idx) {
							m.children().on('keydown', function(e) {
								if(e.which == 9 && !e.shiftKey) { // tab
									e.preventDefault();
									pageBtns.eq(app.nextNumber(pages, m.data('page'), 1)).trigger('click', false);
									items.find('a:visible').first().focus();
								}
							});
						} else if (idx > 0 && n === 1) {
							// 목록의 첫부분에서 shift+tab키를 눌렀을 때 이전페이지의 끝항목에 포커싱
							m.children().on('keydown', function(e) {
								if(e.which == 9 && e.shiftKey) { // shift + tab
									e.preventDefault();
									pageBtns.eq(app.nextNumber(pages, m.data('page'), -1)).trigger('click', false);
									items.find('a:visible').last().focus();
								}
							});
						}
					}
				});

				// 페이징버튼 이벤트 바인딩
				pageBtns.each(function(idx) {
					var a = $(this);
					a.on('click', function(e, doAnimate) {
						e.preventDefault();
						a.siblings().removeClass('on').end().addClass('on');
						movingAnimate(idx, doAnimate);
					});
				}).eq(0).addClass('on');

				// 스와이프 바인딩
				app.onSwipeEnd(img_panel, {
					// 왼쪽
					onLeft: function() {
						var idx = img_panel.data('pageindex') || 0;
						if ((idx = idx  + 1) >= pages) {
							swipeBouncing(false);
							return;
						}
						movingAnimate(idx);
					},
					// 오른쪽
					onRight: function() {
						var idx = img_panel.data('pageindex') || 0;
						if ((idx = idx  - 1) < 0) {
							swipeBouncing(true);
							return;
						}
						movingAnimate(idx);
					}
				})
				// 외부에서 메뉴의 페이지를 이동할 수 있도록 바인딩
				.on('refreshview', function(page){
					movePage(page || $(this).data('pageindex') || 0);
				})
				// 해당 썸네일에 대해서 trigger('selectItem')라고 날렀을 때 해당 썸네일을 활성화시키고 해당 페이지로 이동시킴
				.find('li:has(>a[data-pagecode])').on('selectItem', function(){
					var idx = $(this).data('index'), pageIndex = Math.floor(idx / ITEM_COUNT);
					// 이미지메뉴 활성화
					app.addActiveClass(items, idx);
					// 활성화된 이미지가 위치한 해당페이지로 이동시켜 놓는다.
					movingAnimate(pageIndex, false);
				});
			});
			//////////////////////////////////////////////////////////////////////////////

			setTimeout(function(){
				// 현재 페이지에 해당하는 메뉴들을 활성화
				if(o.pageCode){
					for(var i = 1, ln = Math.ceil(o.pageCode.length / 2); i <= ln; i++) {
						var code = o.pageCode.substring(0, i * 2);
						gnb.find('a[data-pagecode="'+code+'"]').parent().addClass('change').trigger('selectItem')
					}
				}
				// 언어 선택
				gnb.find('ul.network_list.lang>li[data-lang="'+o.pageLang+'"]').addClass('on');
			}, 25);

		});
	};

	/**
	 * 로케이션
	 **/
	$.fn.hanaLocation = function(option) {
		var o = $.extend({
		
			}, option);
		return this.each(function() {
			if (app.checkBuild(this, 'location')) return;

			var self = $(this), menus = self.find('ul.location_wrap>li');

			if (app.isMouse) {
				// PC모드에서는 마우스오버 기능 바인딩
				menus
					.find('>a')
						.on('mousedown mouseup focus blur', function(e) {
							switch (e.type) {
							case 'mousedown':
								$(this).data('mousedown', true); break;
							case 'blur':
							case 'mouseup':
								$(this).removeData('mousedown'); break;
							case 'focus':
								var me = $(this);
								if (!me.data('mousedown')){
									popupManager.show(me, me.next());
								}
								break;
							}
						});

				// 맨 끝의 링크에서 블러가 발생했을 때 드롭메뉴를 숨긴다.
				menus.last().find('a:last').on('blur', function(e) {
					popupManager.hide();
				});
			}
			
			menus
				.find('>a')
				.on('click', function(e){
					e.preventDefault();
				
					var a = $(this), next = a.next(), isview = next.is(':visible');
					if (!isview) {
						popupManager.show(a, next);
					} else {
						popupManager.hide();
					}
				});
				
			// pageCode에 해당하는 메뉴를 활성화
			if(o.pageCode){
				for(var i = 1, ln = Math.ceil(o.pageCode.length / 2); i <= ln; i++) {
					var code = o.pageCode.substring(0, i * 2);
					self.find('a[data-pagecode="'+code+'"]').parent().addClass('change');
				}
			}
		});
	};

 })(__app__, jQuery);


(function(app, $, undefined) {
	/**
	 * 다이얼로그창의 기본 옵션값
	 **/
	var popupDefault = {
		// 오버레이
		overlay: {
		   "position": "absolute", 
			"left":0, 
			"top":0, 
			'opacity':0.7, 
			'backgroundColor':'#000000'
		},
		// 다이얼로그의 위치
		position: {
		   my: "center",
		   at: "center",
		   of: window
		},
		create: function(dialog){
			if(dialog.data('created')) return dialog;

			dialog
				.data('created', true)
				.dialog({ autoOpen: false, modal: true })	// 모달
				//.css({top:'-200px', left:'-50px'})
				.off('dialogopen.hana dialogoutfocus.hana')
				.on('dialogopen.hana', function(){
					// 오버레이 스타일 지정
					$("div.ui-widget-overlay").css(popupDefault.overlay);
				})
				.on('dialogoutfocus.hana', function(){
					// 포커스가 모달창 영역 외로 벗어나면 강제로 포커스를 닫기버튼에 가도록
					dialog.find('a.ui_dialog_close').focus();
				})
				.find('>div.laypop')
					.css('zIndex', 1005)
					.end()
				.find('a.ui_dialog_close')
					.off('click.hana')
					.on('click.hana', function(e){ 
						e.preventDefault(); 						
						// 닫기 버튼을 누르면 창이 닫히도록 바인딩
						dialog.dialog('close');
					})
					.end()
				.parent()
				.find('a.ui-dialog-titlebar-close').hide()		// 다이얼로그가 생성한 닫기버튼을 숨기기
					.end()
				.find('.video_data').css({
					'position':'relative',
					'zIndex': 1010
				}).attr('tabindex', 0);
			return dialog;
		}
	};

	// 다이얼로그 태그가 a태그와 같은 레벨에 있을 때 이 메소드를 사용
	$.fn.hanaInlineVideo = function(option) {
		var o = $.extend({
			width: 780
		}, option);

		return this.each(function(){
			if (app.checkBuild(this, 'inlinevideo')) return;

			var self = $(this);

			self.on('click', function(e) {
				e.preventDefault();
				if (o.onLinkClick && o.onLinkClick.call(this, self.next()) === false) return false;;

				var dialog = popupDefault.create(self.next().clone());
				dialog
					.on('dialogclose', function(){
						dialog.dialog('destroy').remove();
						self.focus();
					})
					.dialog('open')
					.css({'width':o.width})
					.position(popupDefault.position);
			});
		});
	};

	/**
	 * 동영상 다이얼로그
	 **/
	$.fn.hanaVideo = function(option){
		var o = option = $.extend({
			width: 780
		}, option);


		return this.each(function(){
			if (app.checkBuild(this, 'video')) return;

			$(this).on('click', 'a.ui_layer_link', function(e){
				e.preventDefault();

				var link = $(this),
					dialog = popupDefault.create($(o.dialog || 'div.ui_dialog').clone()),	// 장차법에 의해 다얼로그창을 닫으면 dom상태를 원래대로 되돌려야 하기에 다이얼로그창을 clone 해서 뛰운 다음 닫을 때 완전히 삭제
					media = $('.ui_dialog_media', dialog),					// 미디어(비디오, 이미지) 노드
					title = $('p.ui_dialog_title',  dialog),						// 제목 노드
					content = $('span.ui_dialog_content', dialog),		// 내용노드
					close = $('.ui_dialog_close', dialog),						// 닫기 노드
					// 다이얼로그를 생성하여 표시
					showDialog = function() {
						dialog					
							.on('dialogclose.hana', function(){
								dialog.off('dialogclose.hana');
								dialog.dialog('destroy').remove();
								link && link.focus(), link = null;
							})
							.dialog('open')
							.css({'width':o.width})
							.position(popupDefault.position);
					},
					// 미디어, 제목, 컨텐츠를 삽입시킨다.
					setDialogData = function(json){
						media.attr({'src': json['url'], 'title': json['title']});
						title.html(json['title']);
						content.html(json['content']);
						showDialog();
					};

				if(o.onLinkClick) {
					// 클릭 콜백함수 실행
					if(o.onLinkClick.call(link, dialog) !== false) {
						// 콜백함수 안에서 다이얼로그에 내용을 채워야 한다.
						showDialog();
					}
				} else if (o.setMediaData) {
					// 콜백함수에서 json형식으로 데이타를 반환
					setDialogData(o.setMediaData.call(this));
				} else {
					// 기본포맷으로 태깅되어 있을 경우
					var data = link.next();
					if (data.length > 0)  {
						setDialogData({
							url: data.find('>span>a').attr('href'),
							title: data.find('dt').html(),
							content: data.find('dd').html()
						});
					}
				}
			});
		});
	};

	/**
	 * 갤러리 다이얼로그 모듈
	 **/
	$.fn.hanaGallery = function(option){
		var o = option = $.extend({
			width:810
		}, option);

		return this.each(function(){
			if (app.checkBuild(this, 'gallery')) return;

			$(this).delegate('a.ui_layer_link', 'click', function(e){
				e.preventDefault();

				var $link = null,
					$dialog = popupDefault.create($(o.dialog || 'div.ui_dialog').clone()),
					$media = $('.ui_dialog_media', $dialog),
					$title = $('p.ui_dialog_title', $dialog),
					$content = $('span.ui_dialog_content', $dialog),
					$popup = $('a.ui_dialog_popup', $dialog),
					setDialogData = function(json){
						$dialog.dialog('open')
							.css({'width': o.width})
							.position(popupDefault.position)
							.parent().next(".ui-widget-overlay").css(popupDefault.overlay);

						$dialog.find('>div.laypop').css('zIndex', 1005);
						$media.on('load', function(){
							// 이미지가 불러졌을 때 다시한번 위치를 조정해준다. 이미지 사이즈에 따라 창크기가 달라지므로..
							$dialog.position(popupDefault.position);
						});
						$media.attr({'src': json['url'], 'alt': json['title']});
						$title.html(json['title']);
						$content.html(json['content']);
						$popup.attr('href', json['original']);
					};

				$dialog.off('dialogclose.hana')
					.on('dialogclose.hana', function(){
						$dialog.dialog('destroy').remove(); // 닫을때 다이얼로그관련 돔을 모두 청소해준다. 장차법 땜에.........-"-
						$link && $link.focus(), $link = null;
					});


				$link = $(this);
				var $data = $link.siblings('div'), $btn = $data.find('>span>a');
				setDialogData({
					'url':$btn.attr('href'), 
					'original': $btn.attr('data-original'),
					'title': $data.find('dt').html(), 
					'content': $data.find('dd').html()
				});

			});
		});
	};

	/**
	 * SNS 공유하기 위한 팝업 오픈
	 **/
	$.fn.hanaShare = function(option){
		var o = $.extend({}, option);

		return this.each(function(){
			if (app.checkBuild(this, 'share')) return;

			var $this = $(this);

			$this.find('>a').each(function(){
					var type = this.className.replace('btn_', '');
					$(this).off('.hana').on('click.hana', function(e){
						e.preventDefault();

						switch(type){
						case 'facebook':	// 페이스북
							window.open("http://www.facebook.com/sharer.php?u="+encodeURIComponent(location.href)+"", "", 'height=440, width=620, scrollbars=auto');
							break;
						case 'twitter':		// 트위터
							var targetUrl = "http://twitter.com/share?url="+encodeURIComponent(location.href)+"&text="+encodeURIComponent(document.title);
							window.open(targetUrl, "", 'height=440, width=620, scrollbars=auto');
							break;
						case 'me2day':		// 미투데이
							var targetUrl  = "http://me2day.net/posts/new?new_post[body]="+encodeURIComponent(document.title+' '+location.href);
							window.open(targetUrl, "",'');
							break;
						case 'linked':		// 링크드인
							var targetUrl = "http://www.linkedin.com/cws/share?isFramed=false&lang=ko_KR&url="+encodeURIComponent(location.href)+"&original_referer="+encodeURIComponent(location.href)+"&token=&_ts=1348633878478%2E025#state=&from_login=true";
							window.open(targetUrl, "",'height=440, width=620, scrollbars=auto');
							break;
						}
					});
				});
		});
	};

	/**
	 * 숨겨져 있는 영역을 표시하기 위한 더보기 모듈
	 **/
	$.fn.hanaStaticMore = function(option){
		var o = $.extend({}, option);

		// 컨텐츠가 열렸을 때 등록된 핸들러 실행
		function trigger(en) {
			if(o['on'+en]) return o['on'+en];
			return function() {}
		}

		this.each(function(){
			if (app.checkBuild(this, 'staticmore')) return;

			var self = $(this),
				content = $(self.data('content'));

			self.on('click', function(e){
				self.parent().animate({height: 0}, {complete: function(){ self.parent().hide(); }});
				if(trigger('beforeload').call(self, content) === false) return;
				content.show(), trigger('load').call(self, content);
				e.preventDefault();
			});

		});
	};


})(__app__, jQuery);

(function(app, $, undefined) {
	// 메인페이지의 상단 큰 배너(메인에서만 사용)
	$.fn.hanaMainBanner = function(option) {
		var o = $.extend({
			control:'',			// 컨트롤러 박스
			interval: 10000,	// 슬라이딩 인터벌,
			isStopOnOver: false,	// 마우스를 올렸을 때 슬라이딩 멈출지 여부
			duration: 'fast'			// 페이드 속도
		}, option);

		return this.each(function() {
			if (app.checkBuild(this, 'mainbanner')) return;

			var self = $(this),
				banners = self.find('>div'),			// 배너들
				items = banners.find('a'),			// 배너들의 링크
				control = $(o.control),				// 컨트롤러 박스(외부에 존재)
				wrapper = control.find('>div.control_wrap'),		// 래퍼 박스
				txt_tmpl = control.attr('data-tmpl'),					// 템플릿 문자
				tmpl = '<p class="tab_banner"><a href="#{{index}}"><span class="none">'+txt_tmpl+'</span></a></p>',
				tabs = null,
				oplay = wrapper.find('p.btn_play>a'),	// 재생버튼
				ostop = wrapper.find('p.btn_stop>a'),	// 정지버튼
				current = 0,									// 현재 인덱스
				interval = o.interval,							// 인터벌
				count = banners.length,					// 배너 수
				isAnimate = false,							// 애니메이션 중 여부
				timer = null,									// 타이머

				isPlay = false,									// 현재 재생여부
				oldStatus = false,								// 기존상태를 저장

				// 타이머를 클리어
				stopTimer = function() {
					if (timer) {
						clearInterval(timer);
						timer = null;
					}
				},
				
				// 재생시작
				play = function() {
					if(timer){ return; }
					isPlay = true;
					togglePlayButton(true);
					timer = setInterval(function() {
						change(nextNum(1));
					}, interval);
				},
				/**
				 * 다음 인덱스
				 *
				 * @param {Integer} dim -1 / +1
				 * @returns 다음 인덱스
				 */
				nextNum = function(dim) {
					var c = current + dim;
					if (c < 0) { return count - 1; }
					if (c >= count) { return 0; }
					return c;
				},
				// 정지
				stop = function() {
					isPlay = false;
					stopTimer(), togglePlayButton(false);
				},
				/**
				 * 재생/정지 버튼 토글링
				 *
				 * @param {Boolean} play 재생여부
				 */
				togglePlayButton = function(play) {
					ostop.parent()[play?'show':'hide']();
					oplay.parent()[play?'hide':'show']();
				},
				// 배너탭 활성화
				toggleButton = function() {
					wrapper.find('>p.tab_banner').removeClass('on').eq(current).addClass('on');
				},
				/**
				 * 배너 전환
				 *
				 * @param {Integer} idx 배너 인덱스
				 */
				change = function(idx) {
					if (idx === current) { return; }
					var dur = o.duration || 'fast';
					var b = banners.eq(current);				

					isAnimate = true;
					banners.eq(idx).css('opacity', 0).show().stop()[app.isTouch ? 'transition' : 'animate']({'opacity': 1}, dur, function(){ isAnimate = false; });
					b.css('opacity', 1).stop()[app.isTouch ? 'transition' : 'animate']({'opacity': 0}, dur, function(){ b.hide(); });

					current = idx, toggleButton();
				};

			// 배너가 한개 이하면 그냥 빠져나간다.
			if (banners.length <= 1) {
				wrapper.hide();
				return;
			}

			if( !txt_tmpl) {
				alert('not exist control_tmpl!!');
			}

			banners.removeClass('on').filter(':gt(0)').hide();			
			wrapper.find('>p.tab_banner').remove();
			
			// 매너 수만큼 배너탭 버튼을 생성하여 click를 바인딩
			app.repeat(count, function(idx, num) {
				var btn = $(tmpl.replace(/{{index}}/gi, idx + 1));
				wrapper.append(btn.data('index', idx));
				
				if (idx == 0) { btn.addClass('on'); }
				btn.on('click', function(e) {
					e.preventDefault();

					if($(this).hasClass('on')) return;
					stopTimer(), change($(this).data('index')), isPlay && play();
				});
			});
			// 탭버튼을 저장
			tabs = wrapper.find('>.tab_banner>a');

			// 재생버튼 바인딩
			oplay.on('click', function(e) {
				e.preventDefault();
				play(), ostop.focus();
			});
			
			// 정지버튼 바인딩
			ostop.on('click', function(e) {
				e.preventDefault();
				stop(), oplay.focus();
			});

			if (app.isMouse) {
				// 마우스관련 이벤트 전부 무효화
				items.preventMouseEvent();
				
				if (o.isStopOnOver === true) {
					//PC모드일 땐 마우스, 포커스 이벤트 바인딩(in: 일시정지, out: 재생)
					self.on('mouseenter focus mouseleave blur', 'div.big_banner', function(e){ 
						oldStatus = isPlay;
						switch(e.type) {
							case 'mouseenter':
							case 'focusin':
								oldStatus = isPlay, stopTimer();
								break;
							case 'mouseleave':
							case 'fousout':
								oldStatus && play();
								break
						}
					});
				}
			}

			banners.preventMouseEvent();

			// 스와이프 바인딩
			app.onSwipeEnd(banners, {
					//onClick: app.onSwipeClick,
					onEnd: function(){
							stopTimer();
					}, 
					onLeft: function(){
						tabs.eq(nextNum(1)).trigger('click');
					},
					onRight: function(){
						tabs.eq(nextNum(-1)).trigger('click');
					}
				});

			play();
		});
	};

})(__app__, jQuery);


(function(app, $, undefined) {
	// 슬라이더형 배너(메인에서만 사용)
	$.fn.hanaBannerSlider = function(option) {
		var o = $.extend({
			interval: 10000,	// 슬라이딩 인터벌
			autoPlay: true		// 자동재생 여부
		}, option);

		return this.each(function() {
			if (app.checkBuild(this, 'bannerslider')) return;

			var self = $(this),										
				BANNER_WIDTH = self.width(),					// 배너 너비
				controls = self.find('>div.btn_control'),			// 컨트롤러 박스
				btnStart = controls.find('>a.btn_start'),			// 재생 버튼
				btnStop = controls.find('>a.btn_stop'),			// 정지 버튼
				bannerBox = self.find('>ul.ui_banner_list').css({'position': 'absolute'}),		// 배너박스
				pageBox = self.find('>p.page_num'),	// 페이지 박스
				items = bannerBox.find('>li'),				// 배너들
				total = items.length,							// 배너 갯수
				left = 0,
				current = 0,
				interval = o.interval,
				isPlay = false,
				direction = false,
				timer = null,
				/**
				 * 보이는 영역 밖에 있는 배너들은 숨김처리 한다(포커스가 안가도록)
				 * 
				 * @param {Integer} now 현재 인덱스
				 * @param {Boolean} isFocus 포커스를 줄지 여부. 배너에 포커스가 와있을 경우 슬라이딩된 다음배너에 자동으로 포커싱되도록
				 */
				outerHidden = function(now, isFocus) {
					bannerBox.find('a').each(function(idx) {
						if (idx != now) {
							$(this).css('visibility', 'hidden');
						} else {
							isFocus && $(this).focus();
						}
					});
				},
				// 현재 인덱스번호/총 갯수 표시
				caption = function() {
					var childs = pageBox.children();
					childs.last().text(total);	
					return function(page){
						childs.first().text(page);
					};
				}(),
				/**
				 * 페이지 이동
				 *
				 * @param {Integer} dim -1 or +1
				 * @param {Boolean} isFocus 이동후에 포커스를 줄지 여부
				 */
				movePage = function(dim, isFocus) {
					if (bannerBox.data('animated')) {
						return;
					}		

					var showIdx = 0;
					current = app.nextNumber(total, current, dim);

					bannerBox.find('a').css('visibility', 'visible');
					if(dim > 0) {
						if (direction) {
							bannerBox.append(bannerBox.find('li:first')).css('left', 0);
							if (app.isTouch) {
								bannerBox.transition({'left': 0});
							}
						}
						left = -BANNER_WIDTH, showIdx = 1;
						direction = true;
					} else if (dim < 0) {
						if (!direction) {
							bannerBox.prepend(bannerBox.find('li:last'));
							
							if (app.isTouch) {
								bannerBox.css({'left': 0}).transition({'left': -BANNER_WIDTH});
							} else {
								bannerBox.css('left', -BANNER_WIDTH);							
							}
						}
						left = 0, showIdx = 0;
						direction = false;
					}

					bannerBox.data('animated', true)[app.isTouch ? 'transition' : 'animate']({left: left}, 'fast', function() {
						caption(current + 1);
						outerHidden(showIdx, isFocus);
						bannerBox.removeData('animated');
					});
				},
				// 타이머 정지
				stopTimer = function() {
					if(timer) {
						clearInterval(timer);
						timer = null;
					}
				},
				// 재생 시작
				start = function(dim) {
					if(timer) return;
					isPlay = true, btnStart.hide(), btnStop.show();
					timer = setInterval(function() {
						movePage(dim);
					}, interval);
				},
				// 정지
				stop = function() {
					isPlay = false, btnStop.hide(), btnStart.show();
					stopTimer();
				};

			bannerBox.css('width', BANNER_WIDTH * total);
			// 배너 수가 하나 이하일 때 컨트롤러 박스를 숨기고 멈춘다.
			if (total <= 1) {
				controls.remove();
				pageBox.remove();
				if (total == 0) {
					self.remove();
				}
				return;
			}

			var oldStatus = false;
			if (app.isMouse) {
				// PC모드일 때, 마우스오버, 포커스 이벤트 바인딩(in: 멈춤, out: 재생)
				bannerBox.on('mouseenter focus mouseleave blur', 'a', function(e) {
					switch(e.type) {
						case 'mouseenter':
						case 'focusin':
							oldStatus = isPlay, stopTimer();
							$(this).find('img').attr('src', function() {
								return this.src.replace(/_off\.png$/i, '_over.png');
							});
							break;
						case 'mouseleave':
						case 'focusout':
							oldStatus && start(1);
							$(this).find('img').attr('src', function() {
								return this.src.replace(/_over\.png$/i, '_off.png');
							});
							break;
					}
				})
				.find('a').each(function(idx) {
					// 현재 배너에 해당하는 인덱스를 저장
					$(this).data('index', idx).attr('data-index', idx);
				});
			}

			controls.on('click', 'a', function(e) {
				e.preventDefault(), oldStatus = isPlay;
				var btn = $(this);

				if (btn.hasClass('btn_pre')){
					// 이전
					stopTimer(), movePage(-1), oldStatus && start(1);
				} else if (btn.hasClass('btn_next')) {
					// 다음
					stopTimer(), movePage(1), oldStatus && start(1);
				} else if (btn.hasClass('btn_start')) {
					// 재생
					start(1), btnStop.focus();
				} else if (btn.hasClass('btn_stop')) {
					// 정지
					stop(), btnStart.focus();
				}
			});

			// 외부에서 재생, 정지를 제어할 수 있도록 이벤트 등록
			self.on('start', function(){
				start(1);
			}).on('stop', function(){
				stop();
			});
			
			// 마우스관련 이벤트를 전부 무효화 시킨다.
			items.each(function(){
				var self = $(this);
				self.find('img, a').preventMouseEvent();
			});
			
			// 스와이프 바인딩
			app.onSwipeEnd(items.find('a'), {
				onClick: app.onSwipeClick,
				onEnd: function(){
					stopTimer();
				},
				onLeft: function(){
					movePage(1, true), isPlay && start(1);
				},
				onRight: function(){
					movePage(-1, true), isPlay && start(1);
				}
			});

			// 재생시작
			o.autoPlay && start(1);
			outerHidden(0);
		});
	};

})(__app__, jQuery);

(function(app, $, undefined) {
	// 메인페이지의 컨텐츠 슬라이더
	$.fn.hanaMainSlider = function(option) {
		var o = $.extend({
				initTab: 0,
				width: 1024
			}, option),
			MAIN_WIDTH = o.width,
			initTab = o.initTab || 0;

		return this.each(function() {
			if (app.checkBuild(this, 'mainslider')) return;

			var self = $(this),
				parts = self.find('>ul>li'),		// 세 파트
				btns = parts.find('>p>a').each(function(idx){ $(this).data('index', idx); }), // 세 파트의 각각 버튼
				boxes = self.find('div.main_con'),			// 컨테이너
				total = boxes.length,
				current = 0,
				activeMenu = function(btn) {
					app.addActiveClass(btns, btn);
				},
				pos = [[0, -MAIN_WIDTH, -(MAIN_WIDTH * 2)], [MAIN_WIDTH, 0, -MAIN_WIDTH], [MAIN_WIDTH * 2, MAIN_WIDTH, 0]],	// 각 파트별로 화면 중앙에 위치했을 경우 다른 파트들의 절대 left값
				animate = function(idx, beAnimate) {
					current = idx;

					// 애니메이션 효과 사용여부
					if (beAnimate === false) {
						boxes.show();

						if (app.isTouch) {
							boxes.css('left', 0);
						}
						app.repeat(total, function(i) {
							boxes.eq(i)[app.isTouch ? 'transition' : 'css']('left', pos[i][idx]);
							if (idx !== i){
								boxes.eq(i).hide();
							}
						});
					} else {
						boxes.show();

						app.repeat(total, function(i) {
							boxes.eq(i).stop()[app.isTouch ? 'transition' : 'animate']({left: pos[i][idx]}, 'fast', function(){ 
								// 가시영역 밖에 있는 것들은 포커스가 안가도록 숨김으로 바꾼다.
								if (idx !== i) {
									boxes.eq(i).hide();
								}
							});
						});
					}
				};

			boxes.each(function(idx){ 
				if (app.isTouch){
					$(this).show().css({left: 0}).transition({left: MAIN_WIDTH * idx});
				} else {
					$(this).show().css({left: MAIN_WIDTH * idx});
				}
			});

			btns.on('click', function(e, beAnimate){
				e.preventDefault();

				var btn = $(this);
				if (btn.hasClass('on')) { return; }	

				animate(btn.data('index'), beAnimate), activeMenu(btn);
			});

			// 외부에서 호출할 수 있도록 이벤트를 바인딩
			self.on('swipeLeft', function() {
				btns.eq(Math.min(current + 1, total - 1)).trigger('click');
			}).on('swipeRight', function() {
				btns.eq(Math.max(current - 1, 0)).trigger('click');
			});

			animate(initTab, false);
		});
	};

})(__app__, jQuery);

(function(app, $, undefined) {
	
		// facebook
		app.extend({
			FB: {
				appId: '274618775974565', // facebook account : hana2012@gmail.com
				init: function(appId){
					appId && (this.appId = appId);
					
					FB.init({
						appId: hana.FB.appId
					});
					return this;
				},
				// 뉴스피드를 가져온다.
				getNewsFeed: function(){
					var get = function(uid) {
						$.ajax({
							url: '/mainFacebook.do',
							timeout: 10000,
							data: {
								uid: uid
							},
							contentType: 'html',
							success: function(html){
								$('#facebook').html(html);
							},
							error: function(){
								$('#facebook p.txt').html('&#xc8c4;&#xc1a1;&#xd569;&#xb2c8;&#xb2e4;. <br />&#xc608;&#xc0c1;&#xce58; &#xbabb;&#xd55c; &#xc624;&#xb958;&#xb85c; &#xc778;&#xd574; &#xb2f4;&#xbcbc;&#xb77d;&#xc744; &#xac00;&#xc838;&#xc624;&#xae30; &#xbabb; &#xd588;&#xc2b5;&#xb2c8;&#xb2e4;. <br /><br />&gt;&gt;<a href="http://www.facebook.com/hanafn" target="_blank">&#xd558;&#xb098;&#xae08;&#xc735;&#xadf8;&#xb8f9; &#xd398;&#xc774;&#xc2a4;&#xbd81; &#xbc29;&#xbb38;</a>');
								$('#facebook p.like').hide();
							}
						});							
					};
					
				    if (location.host.indexOf('hanafn.com') < 0) {
						get();					
				    } else {
						FB.getLoginStatus(function(response) {
							  if (response.status === 'connected') {
								  var uid = response.authResponse.userID;
								  var accessToken = response.authResponse.accessToken;
								  get(uid);
							  } else{
								  get();
							  }
						});
					}
				},
				// 해당 피드글에 대해서 좋아요를 처리한다.
				doLike: function(objectId, isLiked){
					if (isLiked === true) {
						alert("&#xc774;&#xbbf8; &#xd574;&#xb2f9; &#xb2f4;&#xbcbc;&#xb77d;&#xc5d0; &#xb300;&#xd574; '&#xc88b;&#xc544;&#xc694;'&#xb97c; &#xd558;&#xc168;&#xc2b5;&#xb2c8;&#xb2e4;.");
						return;
					}
					
					FB.getLoginStatus(function(response) {
						  if (response.status === 'connected') {
								// the user is logged in and has authenticated your
								// app, and response.authResponse supplies
								// the user's ID, a valid access token, a signed
								// request, and the time the access token 
								// and signed request each expire
								var uid = response.authResponse.userID;
								var accessToken = response.authResponse.accessToken;
								
								$.ajax({
									url: 'https://graph.facebook.com/'+objectId+'/likes',
									type: 'post',
									data: {
										access_token:accessToken
									},
									success: function(data){
										hana.FB.getNewsFeed();
									}
								});	  
						  }/* else if (response.status === 'not_authorized') {
								// the user is logged in to Facebook, 
								// but has not authenticated your app
						  }*/ else {
								// the user isn't logged in to Facebook.
								var loc = location, remoteAddr = loc.protocol + '//' + loc.host + (loc.port ? ':' + loc.port : '') + '/mainFacebook.do?mode=parent_refresh';
								window.open('https://graph.facebook.com/oauth/authorize?display=popup&client_id='+hana.FB.appId+'&redirect_uri='+encodeURIComponent(remoteAddr), 'fb_login', 'menubar=no, width=400, height=300,scrollbars=no');
						  }
					});						
				}
			}
		});

})(__app__, jQuery);

$(function(){
	var app = __app__;

	// 터치디바이스일 때 body에 ui_touch 클래스를 추가
	app.isTouch && $(document.body).addClass('ui_touch');

	var gnb = $('#gnb'),
		loc = $('#location_wrap');

	// 현재페이지의 메뉴를 활성화시키기 위해 페이지코드와 국가코드를 넘김
	var option = {
		pageCode: (typeof pageCode == 'undefined' ? '' : pageCode),
		pageLang: (typeof pageLang == 'undefined' ? 'KO' : pageLang)
	};

	// GNB
	gnb.hanaGNB(option);

	// Location
	loc.hanaLocation(option);

	// 대다수의 페이지에 공유하기 버튼이 존재하기에 강제로 바인딩
	$('div.sns_wrap').hanaShare();

});